package com.dh.order.controller;

import java.util.Arrays;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;

/**
 * @author 作者 dinghao
 * @version 创建时间：2018年11月21日 上午11:56:10
 * @Description 类说明 : 测试hystrix
 */
@RestController
@RequestMapping("/hystrix")
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

	// 异常,降级(也可以是自己拋异常)
	// // @HystrixProperty 超时设置3s
	// @HystrixCommand(commandProperties = {
	// @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
	// })//fallbackMethod = "fallback"
	@HystrixCommand(commandProperties = {
			// 设置断路器是否生效
			@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
			// 设置在一个滚动窗口中，打开断路器的最少请求数
			@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
			// 设置在断路器被打开，拒绝请求到再次尝试请求的时间间隔
			@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
			// 设置打开断路器并启动回退逻辑的错误比率。x%
			@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
			// 如果该属性设置为true，强制断路器进入打开状态，将会拒绝所有的请求
			// @HystrixProperty(name = "circuitBreaker.forceOpen", value = "false"),
			// 如果该属性设置为true，强制断路器进入关闭状态，将会允许所有的请求，无视错误率。
			// @HystrixProperty(name = "circuitBreaker.forceClosed", value = "false")
	})
//	@HystrixCommand//commandKey默认是方法名
	@GetMapping("/list")
	public String getProductInfoList(@RequestParam("number") Integer number) {
		if (number % 2 == 0) {
			return "success";
		}

		RestTemplate restTemplate = new RestTemplate();
		return restTemplate.postForObject("http://localhost:10002/product/listForOrder",
				Arrays.asList("157875196366160022"), String.class);
	}

	private String fallback() {
		return "太拥挤,一会再试~~";
	}

	private String defaultFallback() {
		return "默认提示: 太拥挤,一会再试~~";
	}

}
